<?php
declare(strict_types=1);

/**
 * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
 * @link      https://cakephp.org CakePHP(tm) Project
 * @since     0.2.9
 * @license   https://opensource.org/licenses/mit-license.php MIT License
 */
namespace App\Controller;

use App\Icbc\DefaultIcbcClient;
use App\Icbc\IcbcConstants;
/**
 * Static content controller
 *
 * This controller will render views from templates/Pages/
 *
 * @link https://book.cakephp.org/4/en/controllers/pages-controller.html
 */
//保证付类
class IcbcsController extends AppController
{
	public function initialize(): void
    {
        parent::initialize();
        $this->loadComponent('IcbcConfig');
    }

    //保证自有资金、明细查询
    public function detailQuery(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "partnerSeq" => $data['partnerSeq'], // 交易流水号
            //"orderCode" => $data['orderCode'], // 订单号
            "memberNo" => $data['memberNo'],// 会员号（查询类型002-必输）Ex."EP1448827912"
            "baginDate" => $data['baginDate'], // 查询开始时间（查询类型001-必输）Ex."20230820053000"
            "endDate" => $data['endDate'],// 查询截止时间（最大跨度为1日，查询类型001-必输）Ex."20230820173000"
            "begNum" => $data['begNum']??"1", // 查询开始条数（查询类型001-必输）
            "fetchNum" => $data['fetchNum']??"100", // 查询条数（最大支持100，查询类型001-必输）
            "status" => $data['status']??"0"// 支付状态（0-成功，1-失败，9-疑账,送空值查询所有状态，查询类型001-选输）
            //"cardNo" => "6232600000001586442"
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cpdetailquery/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //保证金充值、提现
    public function fundDeal(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "partnerSeq" => $data['partnerSeq'], // 交易流水号
            "orderCode" => $data['orderCode'], // 订单号
            "payAmount" => $data['payAmount'], // 交易金额(分)，Ex."53"
            "orderCurr" => $data['orderCurr'], // 交易币种,Ex."001"
            "fundDealflag" => $data['fundDealflag'], // 资金处理标志（1-充值 2-提现 ；入金只支持线上入金）,Ex."2"
            "operType" => "8", // 业务种类（8-保证支付）
            "payerMemberNo" => $data['payerMemberNo'], // 会员编号Ex."yuanhe002"
            // "callbackUrl" => "", // 回调地址
            "submitTime" => $this->_getTradeTime(), // 交易平台提交时间
            "payChannel" => "1", // 渠道类型（1-PC端，资金处理标志 1-充值必输，目前只支持PC）
            "orderRemark" => $data['orderRemark'], // 订单备注,Ex."测试账户结算服务备注"
            // "receiptRemark" => "", // 回单补充信息备注,当需要打印在回单信息中时上送
            // "purpose" => "1", // 用途,打印到回单的用途栏
            // "summary" => "1" // 摘要,打印到回单的摘要栏
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cppfunddeal/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //取消支付
    public function preservationCancel(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "partnerSeq" => $data['partnerSeq'], // 交易流水号
            "orderCode" => $data['orderCode'], // 订单号
            "partnerSeqOrigin" => $data['partnerSeqOrigin'], // 原合作方支付流水号,Ex."20230901test001"
            "payAmount" => $data['payAmount'], // 本次取消金额（单位：分）,Ex."20"
            "orderCurr" => "1", // 交易币种
            "payeeAccno" => $data['payeeAccno'], // 收款人账号,Ex."0200003509200195562"
            "payeeCompanyName" => $data['payeeCompanyName'], // 收款人户名,Ex."恒大集团有限公司"
            "payerAccno" => $data['payerAccno'], // 付款人是他行的情况必须上送，且上送账号必须和付款时账号一致,Ex."0200003509200195438"
            "payerAccname" => $data['payerAccname'], // 选输。付款人是他行的情况上送，上送则校验，不送不校验.Ex."华为技术有限公司"
            "payerBankCode" => $data['payerBankCode'], // 付款人是他行的情况必须上送，且上送账号必须和付款时账号一致.Ex."102461000140"
            "submitTime" =>$this->_getTradeTime(), // 交易平台提交时间,Ex."20230921200409"
            "orderRemark" => $data['orderRemark'], // 订单备注Ex."测试取消支付"
            // "receiptRemark" => "补充信息备注", // 回单补充信息备注
            // "purpose" => "用途", // 用途
            // "summary" => "摘要", // 摘要
            "operType" => "805", // 业务种类 担保/保证支付必输,303-取消支付 805-保证取消支付 809-缴存金释放
            "payerMemberNo" => $data['payerMemberNo'], // 付款方会员编号,业务种类为取消支付时必须上送，operType为809时也要必输,Ex."372"
            "payerMemberName" =>$data['payerMemberName'] , // 付款方会员名称,业务种类为取消支付时必须上送,EX."华为技术有限公司"
            "crmemberNo" => $data['crmemberNo'], // 收款方会员编号（担保/保证支付必输）Ex."367"
            "crmemberName" => $data['crmemberName'] // 收款方会员名称（担保/保证支付必输）Ex."恒大集团有限公司"
            // "enSummry" => "英文备注" // 英文备注)
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cppreservationcancel/V2');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //确认支付
    public function preservationPay(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "partnerSeq" => $data['partnerSeq'], // 交易流水号
            "orderCode" => $data['orderCode'], // 订单号
            "partnerSeqOrigin" =>$data['partnerSeqOrigin'] , // 原合作方支付流水号,Ex."20230901test010"
            "payAmount" => $data['payAmount'], // 本次解保留划拨金额（单位：分）,Ex."50"
            "orderCurr" => "1", // 交易币种
            "payeeSysflag" => $data['payeeSysflag']??"1", // 收款方系统内外标志（1-境内工行，2-境内他行，3-境外）
            "payeeAccno" => $data['payeeAccno'], // 收款人账号,Ex."0200003509200195314"
            "payeeCompanyName" => $data['payeeCompanyName'], // 收款人户名,Ex."联想控股股份有限公司"
            // "payeeBankCode" => "", // 收方行联行号（收款方系统内外标志为2时必输）
            "submitTime" => $this->_getTradeTime(), // 交易平台提交时间,Ex."20230921200409"
            "orderRemark" => $data['orderRemark'], // 订单备注,Ex."测试保证支付确认支付"
            // "receiptRemark" => "", // 20220321145253回单补充信息备注,当需要打印在回单信息中时上送
            // "purpose" => "", // 用途,打印到回单的用途栏
            // "summary" => "", // 摘要,打印到回单的摘要栏
            "operType" => $data['operType']??"804", // 担保/保证业务种类（担保支付/保证支付必输 ，302-担保支付，803-保证支付(农夫专用模式)，804-保证支付确认收货，810-保证支付缴存金支付）
            "payerMemberNo" => $data['payerMemberNo'], // 付款方会员编号（担保支付必输/保证支付必输，会员必须开立保证支付会员）Ex."372"
            "payerMemberName" => $data['payerMemberName'], // 付款方会员名称（担保支付必输/保证支付必输）Ex."华为技术有限公司"
            // "realpayerAccno" => "", // 真实付方账号（仅限分行使用）
            // "realpayerAccnoName" => "", // 真实付方户名（仅限分行使用）
            // "realpayerBankName" => "", // 真实付方行名，非必输（保证支付新增，仅限分行使用）
            // "realpayerBankNo" => "", // 真实付方行号，非必输（保证支付新增，仅限分行使用）
            // "note" => "", // 附言
            "crmemberNo" => $data['crmemberNo'], // 收款方会员编号（担保/保证支付必输）Ex."361"
            "crmemberName" => $data['crmemberName'], // 收款方会员名称（担保/保证支付必输）Ex."联想控股股份有限公司"
            // "tradeName" => "王者币", // 商品名称（担保支付必输）
            // "tradeNum" => "10", // 商品数量（担保支付必输）
            // "tradeUnit" => "10" // 商品单位（担保支付必输）
            "fundDealDirect" => $data['fundDealDirect']??"3" // 资金到账方向（1-自有资金 3-结算账号 803-保证支付(农夫专用模式)，804-保证支付确认收货输入。不输入默认资金入到收方3-结算账号）
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cppreservationpay/V2');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //关闭订单
    public function orderClose(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "partnerSeq" => $data['partnerSeq'], // 交易流水号
            "orderCode" => $data['orderCode'] // 订单号
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cporderclose/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //订单查询
    public function orderQuery(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "partnerSeq" => $data['partnerSeq'], // 交易流水号
            "orderCode" => $data['orderCode'] // 订单号
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cporderquery/V2');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //订单支付申请-保证付
    public function payApply(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "memberNo" => $data['memberNo'], // 合作方会员
            "partnerSeq" => $data['partnerSeq'], // 交易流水号 实例：20121892121523625506
            "payChannel" => $data['payChannel']??"1", // 渠道类型；1-PC端 2-移动端
            "internationalFlag" => $data['internationalFlag']??"1", // 境内外标志 1-境内 2-境外
            "payMode" => "8", // 支付方式：保证付
            //"reservDirect" => "1", // 保留支付时上送，1-付方保留，2-收方保留，境内外币只支持付方保留
            "operType" => "801", // 操作类型
            "payEntitys" => "1001", // 1000第一位1代表现金第二位1代表票据
            "asynFlag" => "0", // 0代表同步支付 1:代表异步支付
            // "logonId"=>"001",//企网登录ID 当异步支付需要指定提交人时才上送(预留字段，本期暂不支持)
            "payerAccno" => $data['payerAccno'], // 付款人账号 异步支付、安心账户退款时必须送账号；保证支付， 如果是采用平台方验证，必须上送付方保证金主账号；其他场景如果送，则为指定账号支付。
            "payerAccname" => $data['payerAccname'], // 付款人户名 付款人账号输入，付款人户名必须同时输入。付款人户名可单独输入，单独输入时，开启户名校验。
            // "payerFeeAccno"=>"",//付方付费账号 境外支付时上送。上送时，则取该账号付手续费;若不上送，则取付方账号付手续费。付方付费账号、付方付费账号户名、付方付费账号币种同时上送或者都不上送.
            // "payerFeeAccName"=>"",//付方付费账号户名
            // "payerFeeCurr"=>"",//付方付费账号币种
            "payMemno" => $data['payMemno'], // 付款人会员号,ex."160290000612012"
            // "orgcode" =>"",//付款人组织机构代码 境内外币、境外必须上送。统一社会信用证的第九-十七位。
            "orderCode" => $data['orderCode'], // 订单编号,ex."207802999502"
            "orderAmount" => $data['orderAmount'], // 订单金额 单位分 仅用于展现，本次应支持金额以sumPayamt为准
            "orderCurr" => "001", // 币种 001人民币
            "sumPayamt" => $data['sumPayamt'], // 订单汇总金额 单位分,本次支付金额=收款金额之和
            // "orderRemark" => "测试", // 订单备注 当需要打印在回单信息中时上送
            // "rceiptRemark" => "测试", // 回单补充信息备注 当需要打印在回单信息中时上送
            // "purpose" => "", // 用途 当需要打印在回单信息中时上送
            // "summary" => "", // 摘要 当需要打印在回单信息中时上送
            "submitTime" => $this->_getTradeTime(), // 交易平台提交时间 Ex."20220325085915"
            "returnUrl" => $data['returnUrl']??"", // 支付成功后跳转连接
            "callbackUrl" => $data['callbackUrl']??"", // 回调通知地址
            // "agreementId"=>"",//合同号 境内外币必须上送，境外支付时上送，三单号不能都上送为空, Ascii字符集，不能有中文和全角字符
            // "invoiceId"=>"",//发票号 境外支付时上送，境内外币必须上送,Ascii字符集，不能有中文和全角字符
            // "manifestId"=>"",//报关单号 境外支付时上送
            // "agreementImageId"=>"",//影像批次号 境内外币必须上送，境外支付时上送
            "enterpriseName"=> $data['enterpriseName'],//付款方企业名称 境内外币支付时上送，保证支付、担保支付时上送付款人会员名称
            // "payRemark"=>"",//支付信息备注
            // "bakReserve1"=>"",//境外交易特殊标志 网金部e链通专用，境外交易特殊标志。
            // "bakReserve2"=>"",//备用字段2
            // "bakReserve3"=>"",//备用字段3
            // "partnerSeqOrigin"=>"201212221215202104",//原合作方支付流水号（待启用，退款时使用）
            // "sumPayamtOrigin"=>"",//原汇总支付金额（备用字段） 待启用
            // "reporterName"=>"",//填报人
            // "reporterContact"=>"",//填报人电话
            // "identityMode"=>"",//认证模式 1-免认证，0或空-其他；仅退款时使用，安心账户退款时必须上送1。使用免认证退款前需与工行签订相关协议，具体咨询客户经理。
            // "payerPhone" => "", // 付款人手机号 11位手机号，线下异步支付时上送、线下异步支付：将收方信息推送给付款人手机号，付款人通过网银、柜面等渠道支付后自动关联订单为成功。使用线下异步支付前需与工行签订相关协议，具体咨询客户经理。
            // "payerWalletId"=>"",//付款人钱包ID 待启用 数字人名币专用
            // "payerWalletName"=>"",//付款人钱包名称 待启用 数字人名币专用
            // "batchNo"=>"",//批次号 批量支付必送。
            // "repetCard"=>"",//财智卡重用标志 财智卡重用模式下使用，重用模式1，其他模式0

            "goodsList" => $data["goodsList"],
//          $data['payeeList']具体格式：
//            array(
//                array(
//                    "goodsSubId" => "0968", // 商品信息子序号
//                    "goodsName" => "测试商品", // 商品名称
//                    "payeeCompanyName" => "饮豆另增古技号午娇缝乓忘嘴易", // 收款人户名,实际含义为商户名称，需和收款人列表(payeeList)中的mallName保持一致
//                    "goodsNumber" => "1", // 商品数量
//                    "goodsUnit" => "个", // 商品单位
//                    "goodsAmt" => "10" // 商品金额 单位分
//                ),
//                array(
//                    "goodsSubId" => "0967", // 商品信息子序号
//                    "goodsName" => "测试商品2", // 商品名称
//                    "payeeCompanyName" => "饮豆另增古技号午娇缝乓忘嘴易", // 收款人户名
//                    "goodsNumber" => "1", // 商品数量
//                    "goodsUnit" => "个", // 商品单位
//                    "goodsAmt" => "10" // 商品金额 单位分
//                )
//            )

            "payeeList" => $data['payeeList'],
//          $data['payeeList']具体格式：
//            array(
//                array(
//                    "mallCode" => "gyjtest001", // 收方商户号 支付时必输，退款时非必输
//                    "mallName" => "工银聚测试001", // 担保支付、保证支付上送收方会员名称
//                    "payeeCompanyName" => "总阵醉", // 收款人户名
//                    "payeeSysflag" => "1", // 境内外标志 1:境内工行，2:境内他行，3:境外
//                    "payeeAccno" => "6222081202000000859", // 收款人账号 担保支付、保证支付时上送会员号绑定的结算账号
//                    "payAmount" => "20" // 收款金额（单位：分）
//
//                )
//            )
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/cppayapply/V2');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }
    }

    //会员查询
    public function memberQuery(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "memberNo" => $data['memberNo'], // 合作方会员
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/memberquery/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //会员档案认证
    public function memberConfirm(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "memberNo" => $data['memberNo'], // 合作方会员
            "returnUrl" => $data['returnUrl'],//实例：www.baidu.com
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/memberconfirm/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }

    }

    //自然人申请
    public function naturalPersonApply(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "memberNo" => $data['memberNo'], // 合作方会员号
            "memberName" => $data['memberName'], // 会员名称
            "memberRole" => $data['memberRole'], // 会员角色（1-付款方 2-收款方）
            "memberType" => "04", // 会员类型（ 01-法人 02-其他组织 03-个体工商户 04-自然人)
            "certificateType" => $data['certificateType']??"0", // 注册登记证件类型（0-身份证 1-护照2-军官证 3-士兵证4-港澳台通行证 5-临时身份证 6-户口簿 9-警官证 12-外国人居留证 101-营业执照 100-组织机构代码证 112-税务登记证 107-统一社会信用代码证 99-其他）不必输 operType为5和6不输入，其他必输，示例：101
            "certificateId" => $data['certificateId'], // 注册登记证件号码 operType为5和6不输入，其他必输，示例：101
            "dealTelphoneNo" => $data['dealTelphoneNo'], // operType为5和6不输入，其他必输，此手机号默认做会员认证及支付使用，示例：13111111111
            "icpCode" => $data['icpCode']??$this->IcbcConfig->get('icpCode'), // ICP备案编号 会员角色为收方必输，可输入合作方平台的ICP备案编号
            "accBankFlag" => $data['accBankFlag']??"1", // operType为5和6不输入，其他必输，示例：1-本行2-他行
            "accno" => $data['accno'], // operType为5和6不输入，其他必输，示例：会员绑定结算账号
            "accName" => $data['accName'], // operType为5和6不输入，其他必输，示例：会员绑定结算账号户名
            "merEname" => $data['merEname'], // 特约商户英文名 specialsupplyer(会员类型为04-自然人 时必输)
            "merShname" => $data['merShname'], // 商户简称 特约商户(会员类型为04-自然人 时必输)
            "saleDepName" => $data['saleDepName'], // 门店名称 门店(会员类型为04-自然人 时必输)
            "shopAddr" => $data['shopAddr'], // 商城地址 商城地址(会员类型为04-自然人 时必输)
            "postCode" => $data['postCode'], // 邮编编码 235001(会员类型为04-自然人 时必输)
            "linkCode" => $data['linkCode'], // 联系人身份证号 123456123456123(会员类型为04-自然人 时必输)
            "eMail" => $data['eMail'], // 联系人邮箱 325614@163.com(会员类型为04-自然人 时必输)
            "regAmt" => $data['regAmt'], // 注册资金 123654123(会员类型为04-自然人 时必输)
            "operType" => $data['operType'] // 1-新增 2-修改 3-绑定 4-解绑（3、4只票据信息绑定时使用）;保证支付专用,5-保证支付订单开卡 6-保证支付分润维护（只支持2个收方，用于开卡设置分润比例后的后续维护） 不必输
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/memberapply/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }
    }

    //公司申请
    public function legalPersonApply(): void
    {
        $data = $this->getRequest()->getData();
        $content = array(
            "agreeCode" => $data['agreeCode']??$this->IcbcConfig->get('agreeCode'), // 合作方协议编号
            "memberNo" => $data['memberNo'], // 合作方会员号
            "memberName" => $data['memberName'], // 会员名称
            "memberRole" => $data['memberRole'], // 会员角色（1-付款方 2-收款方）
            "memberType" => "01", // 会员类型（ 01-法人 02-其他组织 03-个体工商户 04-自然人)
            "certificateType" => $data['certificateType']??"101", // 注册登记证件类型（0-身份证 1-护照2-军官证 3-士兵证4-港澳台通行证 5-临时身份证 6-户口簿 9-警官证 12-外国人居留证 101-营业执照 100-组织机构代码证 112-税务登记证 107-统一社会信用代码证 99-其他）不必输 operType为5和6不输入，其他必输，示例：101
            "certificateId" => $data['certificateType'], // 注册登记证件号码 operType为5和6不输入，其他必输，示例：97327403OD4M94RV7G
            "corpRepreName" => $data['corpRepreName'], // 法人代表姓名 会员类型为01-法人 02-其他组织 03-个体工商户 时必输
            "corpRepreIdType" => $data['corpRepreIdType']??"0", // 法人代表证件类型（0-身份证 1-护照2-军官证 3-士兵证4-港澳台通行证 5-临时身份证 6-户口簿 9-警官证 12-外国人居留证 101-营业执照 100-组织机构代码证 112-税务登记证 107-统一社会信用代码证 99-其他）会员类型为01-法人 02-其他组织 03-个体工商户 时必输
            "corpRepreId" => $data['corpRepreId'], // 法人代表证件号码 会员类型为01-法人 02-其他组织 03-个体工商户 时必输,例子：330103198709010052
            "corpRepreSignDate" => "", // 法人身份证签发日期 2001-01-01 不必输
            "dealName" => $data['dealName'], // 经办人姓名 会员类型为01-法人 02-其他组织 03-个体工商户 时必输
            "dealTelphoneNo" => $data['dealTelphoneNo'], // operType为5和6不输入，其他必输，此手机号默认做会员认证及支付使用，示例：13111111111
            "icpCode" => $data['icpCode']??$this->IcbcConfig->get('icpCode'), // ICP备案编号 会员角色为收方必输，可输入合作方平台的ICP备案编号
            "accBankFlag" => $data['accBankFlag']??"1", // operType为5和6不输入，其他必输，示例：1-本行2-他行
            "accno" => $data['accno'], // operType为5和6不输入，其他必输，示例：会员绑定结算账号,实例：1202051109800066735
            "accName" => $data['accName'], // operType为5和6不输入，其他必输，示例：会员绑定结算账号户名
            "operType" => "1" // 1-新增 2-修改 3-绑定 4-解绑（3、4只票据信息绑定时使用）;保证支付专用,5-保证支付订单开卡 6-保证支付分润维护（只支持2个收方，用于开卡设置分润比例后的后续维护） 不必输
        );

        $respObj = $this->getAPIResult($content, 'https://apipcs3.dccnet.com.cn/api/mybank/pay/cpay/memberapply/V1');

        //pr($respObj);
        if ($respObj["return_code"] == 0) { // sucess
            $this->G->success($respObj["return_msg"]);
        } else { // fail
            $this->G->error($respObj["return_msg"]);
        }
    }

    private function getAPIResult($content, $url, $method = 'POST', $isNeedEncrypt = false): Array
    {
        $appId = $this->IcbcConfig->get('appId');
        $privateKey = $this->IcbcConfig->get('privateKey');
        $icbcPublicKey = $this->IcbcConfig->get('publicKey');

        $request = array(
            "serviceUrl" => $url,
            "method" => $method,
            "isNeedEncrypt" => $isNeedEncrypt,
            "biz_content" => $content
        );

        $client = new DefaultIcbcClient($appId, $privateKey, IcbcConstants::$SIGN_TYPE_RSA2, '', '', $icbcPublicKey, '', '', '', '');
        $msgId =  uniqid(time().'.', true);
        $resp = $client->execute($request, $msgId, ''); // 执行调用;msgId消息通讯唯一编号，要求每次调用独立生成，APP级唯一
        $respObj = json_decode($resp, true);

        return $respObj;
    }

    //获取交易时间，返回格式20230921200409
    private function _getTradeTime(){
        return date('YmdHis');
    }
}
